﻿using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Grid;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Media;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;

namespace SiparisKontrol
{
    public partial class frmDetay : XtraForm
    {
        public string CariKodu { get; set; }
        public int Odeme { get; set; }
        public string SrmMerkezi { get; set; }

        private List<string[]> evraklar = new List<string[]>();
        public List<string[]> Evraklar { get { return evraklar; } }

        Dictionary<string, List<string>> eklenenSeriler = new Dictionary<string, List<string>>();

        public frmDetay()
        {
            InitializeComponent();
        }

        private void frmDetay_Load(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("SELECT     SIPARISLER.sip_RECno, STOKLAR.sto_kod AS [Stok Kodu], STOKLAR.sto_isim AS [Stok Adı], SIPARISLER.sip_miktar AS Miktar, SIPARISLER.sip_teslim_miktar AS Tamamlanan, ");
            sb.Append("                      SIPARISLER.sip_miktar - SIPARISLER.sip_teslim_miktar AS [Kalan Miktar],cast(0 as decimal) as Okutulan,SIPARISLER.sip_b_fiyat AS fiyat, SIPARISLER.sip_iskonto_1 AS isk1,SIPARISLER.sip_iskonto_2 AS isk2, SIPARISLER.sip_iskonto_3 AS isk3, SIPARISLER.sip_iskonto_4 AS isk4, SIPARISLER.sip_iskonto_5 AS isk5, SIPARISLER.sip_vergi_pntr AS kdvid,SIPARISLER.sip_vergi AS kdvtutar,dbo.fn_VergiYuzde(SIPARISLER.sip_vergi_pntr) as kdvoran ");
            sb.Append(" FROM         SIPARISLER INNER JOIN ");
            sb.Append("                      STOKLAR ON SIPARISLER.sip_stok_kod = STOKLAR.sto_kod ");
            sb.Append(" WHERE     (SIPARISLER.sip_tip = 0) AND (SIPARISLER.sip_cins = 0) AND ");

            using (Query q = new Query())
            {
                foreach (string[] item in Evraklar)
                {
                    sb.AppendFormat(" (SIPARISLER.sip_evrakno_seri = '{0}') AND (SIPARISLER.sip_evrakno_sira = {1}) OR", item[0], item[1]);
                }
                sb.Remove(sb.Length - 2, 2);
                q.Add(sb.ToString());

                gridControl1.DataSource = q.Fill();
                gridView1.BestFitColumns();
                gridView1.Columns[0].Visible = false;
                for (int i = 7; i < 16; i++)
                {
                    gridView1.Columns[i].Visible = false;
                }
            }
        }

        private Tuple<string, bool> StokKoduBul(string barkod)
        {
            using (Query q = new Query())
            {
                q.Add("SELECT     STOKLAR.sto_kod,sto_detay_takip FROM         STOKLAR INNER JOIN  BARKOD_TANIMLARI ON STOKLAR.sto_kod = BARKOD_TANIMLARI.bar_stokkodu WHERE     (BARKOD_TANIMLARI.bar_kodu =@barkod)");
                q.Add("@barkod", SqlDbType.NVarChar, barkod);
                var rslt = q.ToList(new { kod = "", tip = byte.MinValue });
                if (rslt.Count > 0)
                {
                    if (rslt[0].tip == 3)
                    {
                        return new Tuple<string, bool>(rslt[0].kod, true);
                    }
                    else
                    {
                        return new Tuple<string, bool>(rslt[0].kod, false);
                    }
                }
            }
            return null;
        }

        private void simpleButton1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < gridView1.RowCount; i++)
            {
                int siparistenKalan = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["Kalan Miktar"]));
                int okutulan = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["Okutulan"]));

                int gereken = siparistenKalan - okutulan;
                if (gereken > 0)
                {
                    MessageBox.Show("Eksik karşılanan ürünler var faturalaştıramazsınız !");
                    return;
                }
            }

            frmFatura frm = new frmFatura();
            int satir = 0;
            for (int i = 0; i < gridView1.RowCount; i++)
            {
                double okutulan = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["Okutulan"]));
                double miktar = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["Miktar"]));

                if (okutulan > 0)
                {
                    double fiyat = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["fiyat"]));
                    double isk1 = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["isk1"]));
                    double isk2 = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["isk2"]));
                    double isk3 = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["isk3"]));
                    double isk4 = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["isk4"]));
                    double isk5 = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["isk5"]));
                    double kdvorn = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["kdvoran"]));
                    int sipid = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["sip_RECno"]));
                    int kdvid = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["kdvid"]));
                    double kdvtutar = Cevir.Parse<double>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["kdvtutar"]));

                    string stokkodu = gridView1.GetRowCellDisplayText(i, gridView1.Columns["Stok Kodu"]);
                    HareketBilgileri hr = new HareketBilgileri();
                    hr.BurutTutar = okutulan * fiyat;
                    hr.Fiyat = fiyat;
                    hr.Isk1Tutar = (isk1 / miktar) * okutulan;
                    hr.Isk2Tutar = (isk2 / miktar) * okutulan;
                    hr.Isk3Tutar = (isk3 / miktar) * okutulan;
                    hr.Isk4Tutar = (isk4 / miktar) * okutulan;
                    hr.Isk5Tutar = (isk5 / miktar) * okutulan;
                    hr.KdvOrani = kdvorn;
                    hr.KdvSira = kdvid;
                    hr.KdvTutari = (kdvtutar / miktar) * okutulan;
                    hr.Miktar = okutulan;
                    hr.Satir = satir;
                    hr.SipDbcNo = 0;
                    hr.SipRecNo = sipid;
                    hr.StokKodu = stokkodu;

                    if (eklenenSeriler.ContainsKey(stokkodu))
                    {
                        List<string> seriler = eklenenSeriler[stokkodu];
                        if (seriler.Count >= okutulan)
                        {
                            string[] dizi = new string[Convert.ToInt32(okutulan)];
                            for (int s = 0; s < okutulan; s++)
                            {
                                dizi[s] = seriler[s];
                            }
                            for (int x = 0; x < dizi.Length; x++)
                            {
                                seriler.RemoveAt(0);
                            }
                            hr.SeriNo = dizi;
                        }
                    }

                    frm.Rows.Add(hr);
                    satir++;
                }
            }
            frm.CariKodu = this.CariKodu;
            frm.SrmMerkezi = this.SrmMerkezi;
            frm.Odeme = this.Odeme;

            if (frm.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                this.Close();
            else
            {
                foreach (var item in frm.Rows)
                {
                    if (eklenenSeriler.ContainsKey(item.StokKodu))
                    {
                        List<string> seriler = eklenenSeriler[item.StokKodu];
                        seriler.AddRange(item.SeriNo);
                    }
                }
            }
        }

        private void txtBarkod_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!string.IsNullOrEmpty(txtBarkod.Text))
                {
                    UrunBul();
                }
            }
        }

        private void UrunBul()
        {
            var sonuc = StokKoduBul(txtBarkod.Text);
            if (sonuc == null)
            {
                SoundPlayer pl = new SoundPlayer(Properties.Resources.error);
                pl.Play();
                MessageBox.Show("Ürün Bulunamadı !");
                return;
            }
            string stokkod = sonuc.Item1;
            if (!string.IsNullOrEmpty(stokkod))
            {
                bool var = false;
                for (int i = 0; i < gridView1.RowCount; i++)
                {
                    string kod = gridView1.GetRowCellDisplayText(i, gridView1.Columns["Stok Kodu"]);
                    if (kod == stokkod)
                    {
                        var = true;
                    }
                }

                if (var)
                {
                    if (checkEdit1.Checked)
                    {
                        txtBarkod.Tag = sonuc.Item2;
                        txtMiktar.Tag = stokkod;
                        txtMiktar.Focus();
                    }
                    else
                    {
                        txtBarkod.Tag = sonuc.Item2;
                        txtMiktar.Tag = stokkod;
                        MiktarEkle(1);
                    }
                }
                else
                {
                    SoundPlayer pl = new SoundPlayer(Properties.Resources.error);
                    pl.Play();
                    MessageBox.Show("Ürün siparişte yok !");
                    txtBarkod.Text = "";
                    txtBarkod.Tag = "";
                    txtMiktar.Tag = "";
                    txtBarkod.Focus();
                }
            }
            else
            {
                SoundPlayer pl = new SoundPlayer(Properties.Resources.error);
                pl.Play();
                txtBarkod.Tag = "";
                txtMiktar.Tag = "";
                MessageBox.Show("Barkod sisteme kayıtlı değil !");
                txtBarkod.Text = "";
                txtBarkod.Focus();
            }
        }

        private void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)
        {
            GridView View = sender as GridView;
            if (e.RowHandle >= 0)
            {
                decimal okutulan = Cevir.Parse<decimal>(View.GetRowCellDisplayText(e.RowHandle, View.Columns["Okutulan"]));
                decimal kalan = Cevir.Parse<decimal>(View.GetRowCellDisplayText(e.RowHandle, View.Columns["Kalan Miktar"]));

                if (okutulan > 0)
                {
                    if (okutulan == kalan)
                    {
                        e.Appearance.BackColor = Color.Green;
                    }
                    else if (kalan > okutulan)
                    {
                        e.Appearance.BackColor = Color.Red;
                    }
                    else if (kalan < okutulan)
                    {
                        e.Appearance.BackColor = Color.Blue;
                    }
                }
            }
        }

        private void txtMiktar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (!string.IsNullOrEmpty(txtMiktar.Text))
                {
                    int miktar = Cevir.Parse<int>(txtMiktar.Text);
                    MiktarEkle(miktar);
                }
                txtMiktar.Text = "";
            }
        }

        [DllImport("kernel32.dll")]
        public static extern bool Beep(int BeepFreq, int BeepDuration);

        private void MiktarEkle(int miktar)
        {
            string[] serinolar = null;
            if (Cevir.Parse<bool>(txtBarkod.Tag))
            {
                frmSeriNo frm = new frmSeriNo();
                frm.Miktar = miktar;
                if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    serinolar = frm.Serinolar.ToArray();

                    if (eklenenSeriler.ContainsKey(txtMiktar.Tag.ToString()))
                    {
                        List<string> liste = eklenenSeriler[txtMiktar.Tag.ToString()];
                        liste.AddRange(serinolar);
                    }
                    else
                    {
                        List<string> liste = new List<string>();
                        liste.AddRange(serinolar);
                        eklenenSeriler.Add(txtMiktar.Tag.ToString(), liste);
                    }
                }
            }

            int sonRowid = -1;
            for (int i = 0; i < gridView1.RowCount; i++)
            {
                if (gridView1.GetRowCellDisplayText(i, gridView1.Columns["Stok Kodu"]) == txtMiktar.Tag.ToString())
                {
                    int siparistenKalan = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["Kalan Miktar"]));
                    int okutulan = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(i, gridView1.Columns["Okutulan"]));

                    int gereken = siparistenKalan - okutulan;

                    sonRowid = i;
                    if (gereken > 0)
                    {
                        if (miktar >= gereken) // okutulan gerekenden büyükse
                        {
                            gridView1.SetRowCellValue(i, gridView1.Columns["Okutulan"], okutulan + gereken);
                            miktar = miktar - gereken;
                        }
                        else
                        {
                            gridView1.SetRowCellValue(i, gridView1.Columns["Okutulan"], okutulan + miktar);
                            miktar = 0;
                        }
                    }
                }
            }

            if (miktar > 0)
            {
                int okutulan = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(sonRowid, gridView1.Columns["Okutulan"]));
                int siparistenKalan = Cevir.Parse<int>(gridView1.GetRowCellDisplayText(sonRowid, gridView1.Columns["Kalan Miktar"]));
                int fark = siparistenKalan - okutulan;

                if (fark > 0)
                {
                    if (fark >= miktar)
                    {
                        gridView1.SetRowCellValue(sonRowid, gridView1.Columns["Okutulan"], okutulan + miktar);
                    }
                    else
                    {
                        gridView1.SetRowCellValue(sonRowid, gridView1.Columns["Okutulan"], okutulan + (fark - miktar));
                    }
                }
                else
                {
                    SoundPlayer pl = new SoundPlayer(Properties.Resources.error);
                    pl.Play();
                    MessageBox.Show("Siparişten fazla girildi !");
                }
            }

            txtBarkod.Text = "";
            txtMiktar.Tag = "";
            txtMiktar.Text = "";
            gridView1.RefreshData();
            txtBarkod.Focus();
        }

        private void checkEdit1_CheckedChanged(object sender, EventArgs e)
        {
            if (checkEdit1.Checked)
            {
                txtMiktar.Enabled = true;
            }
            else
            {
                txtMiktar.Enabled = false;
            }
        }
    }
}
